#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QMainWindow>

#include<qfont.h>

#include<QMessageBox>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle("赵远");

    //设置文本框字体格式
    QFont textEditFont ( "Microsoft YaHei", 45, 75);
    ui->textEdit->setFont(textEditFont);

    //设置按键字体
    ui->pbtn_0->setFont(QFont("楷体", 18));//1
    ui->pbtn_1->setFont(QFont("楷体", 18));//2
    ui->pbtn_2->setFont(QFont("楷体", 18));//3
    ui->pbtn_3->setFont(QFont("楷体", 18));//4
    ui->pbtn_4->setFont(QFont("楷体", 18));//5
    ui->pbtn_5->setFont(QFont("楷体", 18));//6
    ui->pbtn_6->setFont(QFont("楷体", 18));//7
    ui->pbtn_7->setFont(QFont("楷体", 18));//8
    ui->pbtn_8->setFont(QFont("楷体", 18));//9
    ui->pbtn_9->setFont(QFont("楷体", 18));//10
    ui->pbtn_AC->setFont(QFont("楷体", 18));//11
    ui->pbtn_dengyu->setFont(QFont("楷体", 18));//12
    ui->pbtn_exit->setFont(QFont("楷体", 18));//13
    ui->pbtn_point->setFont(QFont("楷体", 18));//14
    ui->pbtn_rightbracket->setFont(QFont("楷体", 18));//15
    ui->pbtn_leftbracket->setFont(QFont("楷体", 18));//16
    ui->pbtn_add->setFont(QFont("楷体", 18));//17
    ui->pbtn_multiply->setFont(QFont("楷体", 18));//18
    ui->pbtn_minus->setFont(QFont("楷体", 18));//19
    ui->pbtn_divide->setFont(QFont("楷体", 18));//20

    //设置文本框内容不可修改
    ui->textEdit->setReadOnly(true);

    //设置初始显示0
    ui->textEdit->setText("0");

    //设置单击Exit按钮关闭界面
    connect(ui->pbtn_exit,&QPushButton::clicked,this,[=](){this->close();});

    //设置文本框内容右对齐
    on_actionRight_triggered();

    //绑定按键0~9与槽函数
    connect(ui->pbtn_0,&QPushButton::clicked,[this](){pbtnf_0();});
    connect(ui->pbtn_1,&QPushButton::clicked,[this](){pbtnf_1();});
    connect(ui->pbtn_2,&QPushButton::clicked,[this](){pbtnf_2();});
    connect(ui->pbtn_3,&QPushButton::clicked,[this](){pbtnf_3();});
    connect(ui->pbtn_4,&QPushButton::clicked,[this](){pbtnf_4();});
    connect(ui->pbtn_5,&QPushButton::clicked,[this](){pbtnf_5();});
    connect(ui->pbtn_6,&QPushButton::clicked,[this](){pbtnf_6();});
    connect(ui->pbtn_7,&QPushButton::clicked,[this](){pbtnf_7();});
    connect(ui->pbtn_8,&QPushButton::clicked,[this](){pbtnf_8();});
    connect(ui->pbtn_9,&QPushButton::clicked,[this](){pbtnf_9();});

    //绑定清零按钮与槽函数
    connect(ui->pbtn_AC,&QPushButton::clicked,[this](){pbtnf_AC();});

    //绑定小数点按钮
    connect(ui->pbtn_point,&QPushButton::clicked,[this](){pbtnf_point();});

    //绑定左右括号按钮
    connect(ui->pbtn_leftbracket,&QPushButton::clicked,[this](){pbtnf_leftbracket();});
    connect(ui->pbtn_rightbracket,&QPushButton::clicked,[this](){pbtnf_rightbracket();});

    //绑定加减乘除槽函数
    connect(ui->pbtn_add,&QPushButton::clicked,[this](){pbtnf_add();});
    connect(ui->pbtn_multiply,&QPushButton::clicked,[this](){pbtnf_multiply();});
    connect(ui->pbtn_minus,&QPushButton::clicked,[this](){pbtnf_minus();});
    connect(ui->pbtn_divide,&QPushButton::clicked,[this](){pbtnf_divide();});


    //绑定等于槽函数
    connect(ui->pbtn_dengyu,&QPushButton::clicked,[this](){pbtnf_dengyu();});
}

//开始定义每一个槽函数以及辅助函数

//定义右对齐函数
void MainWindow::on_actionRight_triggered()
{
    ui->textEdit->setAlignment(Qt::AlignRight);
}

//定义0~9按钮槽函数
void MainWindow::pbtnf_0()
{
    if(str=="#")    ui->textEdit->clear();

    //bracketdigiterror();

    str+="0";

    on_actionRight_triggered();

    ui->textEdit->textCursor().insertText("0");
}

void MainWindow::pbtnf_1()
{
    if(str=="#")    ui->textEdit->clear();

    //bracketdigiterror();

    str+="1";

    on_actionRight_triggered();

    ui->textEdit->textCursor().insertText("1");
}

void MainWindow::pbtnf_2()
{
    if(str=="#")    ui->textEdit->clear();

    //bracketdigiterror();

    str+="2";

    on_actionRight_triggered();

    ui->textEdit->textCursor().insertText("2");
}

void MainWindow::pbtnf_3()
{
    if(str=="#")    ui->textEdit->clear();

    //bracketdigiterror();

    str+="3";

    on_actionRight_triggered();

    ui->textEdit->textCursor().insertText("3");
}

void MainWindow::pbtnf_4()
{
    if(str=="#")    ui->textEdit->clear();

    //bracketdigiterror();

    str+="4";

    on_actionRight_triggered();

    ui->textEdit->textCursor().insertText("4");
}

void MainWindow::pbtnf_5()
{
    if(str=="#")    ui->textEdit->clear();

    //bracketdigiterror();

    str+="5";

    on_actionRight_triggered();

    ui->textEdit->textCursor().insertText("5");
}

void MainWindow::pbtnf_6()
{
    if(str=="#")    ui->textEdit->clear();

    //bracketdigiterror();

    str+="6";

    on_actionRight_triggered();

    ui->textEdit->textCursor().insertText("6");
}

void MainWindow::pbtnf_7()
{
    if(str=="#")    ui->textEdit->clear();

    //bracketdigiterror();

    str+="7";

    on_actionRight_triggered();

    ui->textEdit->textCursor().insertText("7");
}

void MainWindow::pbtnf_8()
{
    if(str=="#")    ui->textEdit->clear();

    //bracketdigiterror();

    str+="8";

    on_actionRight_triggered();

    ui->textEdit->textCursor().insertText("8");
}

void MainWindow::pbtnf_9()
{
    if(str=="#")    ui->textEdit->clear();

    //bracketdigiterror();

    str+="9";

    on_actionRight_triggered();

    ui->textEdit->textCursor().insertText("9");
}

//定义归零函数
void MainWindow::pbtnf_AC()

{

    str="#";

    ui->textEdit->setText("0");

    on_actionRight_triggered();
}

//定义小数点函数
void MainWindow::pbtnf_point()
{
    if(str=="#")    ui->textEdit->clear();

    //bracketdigiterror();

    str+=".";

    on_actionRight_triggered();

    ui->textEdit->textCursor().insertText(".");
}

//定义左括号槽函数
void MainWindow::pbtnf_leftbracket()

{

    if(str=="#")    ui->textEdit->clear();

    //char*s=str.toLocal8Bit().data();

    //digitbracketerror();

    str+="(";

    on_actionRight_triggered();

    ui->textEdit->textCursor().insertText("(");
}

//定义右括号槽函数
void MainWindow::pbtnf_rightbracket()

{

    if(str=="#")

    ui->textEdit->clear();

    if(!bracketerror())//检查左括号，左括号缺失

    {
        QMessageBox::about(this,"提示","请检查一下左括号数量");

        //这一步要包含QmessageBox头文件，指的是，如果出现这样的错误，    //会弹出弹窗弹窗标题为“输入错误”，内容为“请检查左括号数量”

        digitbracketerror();//判错函数

        str+="(";

        on_actionRight_triggered();//对齐

        ui->textEdit->textCursor().insertText("(");//补齐缺失的左括号
    }

    else//正常输入，无错误的情况
    {

        char*s=str.toLocal8Bit().data();//转化为char*

        if(s[strlen(s)-1]=='(')//如果‘)’前一个是‘（’，证明括号里什么                           //也没有,需要提示并补充个1.

        {

            QMessageBox::about(this,"提示","括号里面没有计算或者数字");

            str+="1";

            ui->textEdit->textCursor().insertText("1");

        }

        str+=")";//一切正常的话，则将‘）’加入str

        on_actionRight_triggered();

        ui->textEdit->textCursor().insertText(")");

    }
}

//定义加减乘除槽函数
void MainWindow::pbtnf_add()

{

    str+="+";

    ui->textEdit->textCursor().insertText("+");

    on_actionRight_triggered();
}
void MainWindow::pbtnf_multiply()
{

    str+="*";

    ui->textEdit->textCursor().insertText("*");

    on_actionRight_triggered();
}
void MainWindow::pbtnf_minus()
{

    str+="-";

    ui->textEdit->textCursor().insertText("-");

    on_actionRight_triggered();
}
void MainWindow::pbtnf_divide()
{

    str+="/";

    ui->textEdit->textCursor().insertText("/");

    on_actionRight_triggered();
}


//定义几个纠错函数
void MainWindow::digitbracketerror()

{

    char*s=str.toLocal8Bit().data();

    if(isdigit(s[strlen(s)-1])||s[strlen(s)-1]==')')

    {

        QMessageBox::about(this,"提示","您要输入的左括号前是数");

        str+="*";

        ui->textEdit->textCursor().insertText("*");

    }

}

void MainWindow::bracketdigiterror()

{

    char* s=str.toLocal8Bit().data();

    if(s[strlen(s)-1]==')')

    {

        QMessageBox::about(this,"提示","您要输入的数字前是右括号");

        str+="*";

        ui->textEdit->textCursor().insertText("*");
    }
}

int MainWindow::bracketerror()

{

    int l=0,r=0;

    for(int i=0;i<str.size();i++)

    {

        if(str[i]=='(')l++;

        if(str[i]==')')r++;

    }

    return l-r;

}

//定义等于按钮槽函数
void MainWindow::pbtnf_dengyu()
{

    if(str=="#")
        QMessageBox::about(this,"提示","不可以直接输出等号");
    else{

//    str=parseFormula(str);
//    double x=calculatePostfix(str);
//    QString rnt=QString::number(x);

    //计算结果
    str.remove(0,1);
    double d = calculate(str);
    QString rnt = QString::number(d);

    //保证格式
    ui->textEdit->clear();
    on_actionRight_triggered();

    //输出结果
    ui->textEdit->textCursor().insertText(rnt);
    //ui->textEdit->setText(rnt);
    //ui->textEdit->setText(str);

    str="#";
    }
}

//对表达式求值
double MainWindow::calculate(QString s) {
    QStack<double> nums;
    QStack<QChar> ops;

    int n = s.size();
    for (int i = 0; i < n; ++i) {
        QChar c = s[i];
        if (c == ' ') continue;
        if (c.isDigit()) {
                int x = 0, j = i;
                while (j < n && (s[j].isDigit())) {
                    x = x * 10 + (s[j].digitValue());
                    ++j;
                }
                i = j - 1;
                nums.push(x);
        } else if (c == '(') {
                ops.push(c);
        } else if (c == ')') {
                while (ops.top() != '(') {
                    QChar op = ops.top(); ops.pop();
                    double b = nums.top(); nums.pop();
                    double a = nums.top(); nums.pop();
                    if (op == '+') nums.push(a + b);
                    else if (op == '-') nums.push(a - b);
                    else if (op == '*') nums.push(a * b);
                    else if (op == '/') nums.push(a / b);
                }
                ops.pop();
        } else {
                while (!ops.empty() && precedence(ops.top()) >= precedence(c)) {
                    QChar op = ops.top(); ops.pop();
                    double b = nums.top(); nums.pop();
                    double a = nums.top(); nums.pop();
                    if (op == '+') nums.push(a + b);
                    else if (op == '-') nums.push(a - b);
                    else if (op == '*') nums.push(a * b);
                    else if (op == '/') nums.push(a / b);
                }
                ops.push(c);
        }
    }

    while (!ops.empty()) {
    QChar op = ops.top(); ops.pop();
    double b = nums.top(); nums.pop();
    double a = nums.top(); nums.pop();
    if (op == '+') nums.push(a + b);
    else if (op == '-') nums.push(a - b);
    else if (op == '*') nums.push(a * b);
    else if (op == '/') nums.push(a / b);
    }

    return nums.top();
}


int MainWindow::precedence(QChar op) {
    if (op == '+' || op == '-') return 1;
    if (op == '*' || op == '/') return 2;
    return 0;
}



MainWindow::~MainWindow()
{
    delete ui;
}


